//类从这里开始
var DateTimeUtils=new Object();
DateTimeUtils.Convert={
    /*
     将Date/String类型,解析为String类型.
     传入String类型,则先解析为Date类型
     不正确的Date,返回 ''
     如果时间部分为0,则忽略,只返回日期部分（已废弃）.
     */
    formatDate:function(v){
        var formateNum=function(num)
        {
            return num < 10 ? '0' + num : num;
        }
        if(typeof v == 'string') v = DateTimeUtils.Convert.parseDate(v);
        if(v instanceof Date){
            var y = v.getFullYear();
            var m = v.getMonth() + 1;
            var d = v.getDate();
            var h = v.getHours();
            var i = v.getMinutes();
            var s = v.getSeconds();
            var ms = v.getMilliseconds();
            if(ms>0) return y + '-' + formateNum(m) + '-' + formateNum(d) + ' ' + formateNum(h) + ':' + formateNum(i) + ':' + formateNum(s) + '.' + formateNum(ms);
            if(h>0 || i>0 || s>0)
                if(s>0)
                    return y + '-' + formateNum(m) + '-' + formateNum(d) + ' ' + formateNum(h) + ':' + formateNum(i) + ':' + formateNum(s);
                else
                    return y + '-' + formateNum(m) + '-' + formateNum(d) + ' ' + formateNum(h) + ':' + formateNum(i);
            return y + '-' + formateNum(m) + '-' + formateNum(d) + ' ' + formateNum(h) + ':' + formateNum(i);
        }
        return '';
    },
    /*
     将String类型解析为Date类型.
     parseDate('2006-1-1') return new Date(2006,0,1)
     parseDate(' 2006-1-1 ') return new Date(2006,0,1)
     parseDate('2006-1-1 15:14:16') return new Date(2006,0,1,15,14,16)
     parseDate(' 2006-1-1 15:14:16 ') return new Date(2006,0,1,15,14,16);
     parseDate('2006-1-1 15:14:16.254') return new Date(2006,0,1,15,14,16,254)
     parseDate(' 2006-1-1 15:14:16.254 ') return new Date(2006,0,1,15,14,16,254)
     parseDate('不正确的格式') retrun null
     */
    parseDate:function(str){
        if(typeof str == 'string'){
            var results = str.match(/^ *(\d{4})-(\d{1,2})-(\d{1,2}) *$/);
            if(results && results.length>3)
                return new Date(parseInt(results[1]),parseInt(results[2]) -1,parseInt(results[3]));
            results = str.match(/^ *(\d{4})-(\d{1,2})-(\d{1,2}) +(\d{1,2}):(\d{1,2}):(\d{1,2}) *$/);
            if(results && results.length>6)
                return new Date(parseInt(results[1]),parseInt(results[2]) -1,parseInt(results[3]),parseInt(results[4]),parseInt(results[5]),parseInt(results[6]));
            results = str.match(/^ *(\d{4})-(\d{1,2})-(\d{1,2}) +(\d{1,2}):(\d{1,2}):(\d{1,2})\.(\d{1,9}) *$/);
            if(results && results.length>7)
                return new Date(parseInt(results[1]),parseInt(results[2]) -1,parseInt(results[3]),parseInt(results[4]),parseInt(results[5]),parseInt(results[6]),parseInt(results[7]));
        }
        return null;
    }
};

+ function($) {
    "use strict";


    var today = new Date();

    /*
     将Date/String类型,解析为String类型.
     传入String类型,则先解析为Date类型
     不正确的Date,返回 ''
     如果时间部分为0,则忽略,只返回日期部分（已废弃）.
     */
    /*
     var formatDate=function(v){
     var formateNum=function(num)
     {
     return num < 10 ? '0' + num : num;
     }
     if(typeof v == 'string') v = parseDate(v);
     if(v instanceof Date){
     var y = v.getFullYear();
     var m = v.getMonth() + 1;
     var d = v.getDate();
     var h = v.getHours();
     var i = v.getMinutes();
     var s = v.getSeconds();
     var ms = v.getMilliseconds();
     if(ms>0) return y + '-' + formateNum(m) + '-' + formateNum(d) + ' ' + formateNum(h) + ':' + formateNum(i) + ':' + formateNum(s) + '.' + formateNum(ms);
     if(h>0 || i>0 || s>0)
     if(s>0)
     return y + '-' + formateNum(m) + '-' + formateNum(d) + ' ' + formateNum(h) + ':' + formateNum(i) + ':' + formateNum(s);
     else
     return y + '-' + formateNum(m) + '-' + formateNum(d) + ' ' + formateNum(h) + ':' + formateNum(i);
     return y + '-' + formateNum(m) + '-' + formateNum(d) + ' ' + formateNum(h) + ':' + formateNum(i);
     }
     return '';
     }
     */
    /*
     将String类型解析为Date类型.
     parseDate('2006-1-1') return new Date(2006,0,1)
     parseDate(' 2006-1-1 ') return new Date(2006,0,1)
     parseDate('2006-1-1 15:14:16') return new Date(2006,0,1,15,14,16)
     parseDate(' 2006-1-1 15:14:16 ') return new Date(2006,0,1,15,14,16);
     parseDate('2006-1-1 15:14:16.254') return new Date(2006,0,1,15,14,16,254)
     parseDate(' 2006-1-1 15:14:16.254 ') return new Date(2006,0,1,15,14,16,254)
     parseDate('不正确的格式') retrun null
     */
    /*
     var parseDate=function(str){
     if(typeof str == 'string'){
     var results = str.match(/^ *(\d{4})-(\d{1,2})-(\d{1,2}) *$/);
     if(results && results.length>3)
     return new Date(parseInt(results[1]),parseInt(results[2]) -1,parseInt(results[3]));
     results = str.match(/^ *(\d{4})-(\d{1,2})-(\d{1,2}) +(\d{1,2}):(\d{1,2}):(\d{1,2}) *$/);
     if(results && results.length>6)
     return new Date(parseInt(results[1]),parseInt(results[2]) -1,parseInt(results[3]),parseInt(results[4]),parseInt(results[5]),parseInt(results[6]));
     results = str.match(/^ *(\d{4})-(\d{1,2})-(\d{1,2}) +(\d{1,2}):(\d{1,2}):(\d{1,2})\.(\d{1,9}) *$/);
     if(results && results.length>7)
     return new Date(parseInt(results[1]),parseInt(results[2]) -1,parseInt(results[3]),parseInt(results[4]),parseInt(results[5]),parseInt(results[6]),parseInt(results[7]));
     }
     return null;
     }
     */
    var getYears = function(minDate,maxDate) {

        var min=(minDate)?minDate.getFullYear():1960;
        var max=(maxDate)?maxDate.getFullYear():2020;
        var arr = [];
        for (var i = min;
             i <= max;
             i++
        ) { arr.push(i);}
        return arr;
    }
    var getMonthes= function(minDate,maxDate) {
        return ('01 02 03 04 05 06 07 08 09 10 11 12').split(' ');
    }
    var getDays = function(max,minDate,maxDate) {
        var days = [];
        for(var i=1; i<= (max||31);i++) {
            days.push(i < 10 ? "0"+i : i);
        }
        return days;
    };
    var getHours=function(hourLimit){
        var arr = [];
        if(hourLimit)
        {
            for(var i=0;i<hourLimit.length;i++)
            {
                arr.push(hourLimit[i]<10?'0'+hourLimit[i]:hourLimit[i]);
            }
        }
        else
        {
            for (var i = 0; i <= 23; i++) { arr.push(i < 10 ? '0' + i : i); }
        }
        //console.log(arr);

        return arr;

    };
    var getMinutes=function(interval){
        if(!interval)
        {
            interval=60;
        }
        var arr = [];
        for (var i = 0; i <= 59; i+=Math.ceil(60/interval)) { arr.push(i < 10 ? '0' + i : i); }
        return arr;

    };

    var getDaysByMonthAndYear = function(month, year) {
        var int_d = new Date(year, parseInt(month)+1-1, 1);
        var d = new Date(int_d - 1);
        return getDays(d.getDate());
    };

    var fnum = function (n) {
        return (n < 10 ? "0" + n : n).toString();
    };

    var initDefaults=function(def)
    {
        def.cols=[
            // Years
            {
                values: getYears()
            },
            // Months
            {
                values: getMonthes()
            },
            // Days
            {
                values: getDays()
            },

            // Space divider
            {
                divider: true,
                content: '  '
            },
            // Hours
            {
                values: getHours(def.hourLimit)
            },
            // Divider
            {
                divider: true,
                content: ':'
            },
            // Minutes
            {
                values: getMinutes(def.customMinuteInterval)
            }
        ];
        def.onChange= function (picker, values, displayValues) {
            if(picker.params.minDate&&picker.params.maxDate) {

                var min=DateTimeUtils.Convert.parseDate(picker.params.minDate);
                var max=DateTimeUtils.Convert.parseDate(picker.params.maxDate);
                if(max>min)
                {
                    //处理年
                    var currentYearValue = picker.cols[0].value;//年 所选择的当前值
                    if(currentYearValue>max.getFullYear())
                        picker.cols[0].setValue(max.getFullYear());//设置为更新后的年
                    if(currentYearValue<min.getFullYear())
                        picker.cols[0].setValue(min.getFullYear());//设置为更新后的年
                    //处理月,月跟年不同，月跟年有关联，开始日期的年所对应的月是从开始日期算下来到年底的月，结束日期的年多对应的月是从1月到结束日期对应的月
                    var currentMonthValue=picker.cols[1].value;//月 所选择的当前值
                    var months=getMonthes(min,max);
                }
            }
            //处理日
            var days = getDaysByMonthAndYear(picker.cols[1].value, picker.cols[0].value);//获取指定月的天数据
            var currentValue = picker.cols[2].value;//日 所选择的当前值
            if(currentValue > days.length) currentValue = days.length;//超过指定月的天，则设为最大值，用于处理30或31
            picker.cols[2].setValue(currentValue);//设置为更新后的天
        };
        def.formatValue= function (p, values, displayValues) {//格式化为字符串格式日期
            if(p.params)
            {
                if(p.params.hideHour)
                {
                    return displayValues[0] + '-' + values[1] + '-' + values[2] ;
                }
                else if(p.params.hideMinute)
                {
                    return displayValues[0] + '-' + values[1] + '-' + values[2] + ' ' + values[3];
                }
            }
            return displayValues[0] + '-' + values[1] + '-' + values[2] + ' ' + values[3] + ':' + values[4];
        }
        //将传入的customValue处理成数组格式
        if(def.customValue) {
            //console.log(def.customValue);
            var date = DateTimeUtils.Convert.parseDate(def.customValue);
            var datestr = DateTimeUtils.Convert.formatDate(date);
            var valueArray = datestr.split('-');
            var t1 = valueArray[2].split(' ');
            valueArray = valueArray.concat(t1);
            valueArray.splice(2, 1);
            var t2
            if (valueArray[3]) {//formatDate函数会去掉 0：0：0的时间参数，故加此处理
                t2 = valueArray[3].split(':');

            }else
            {
                t2 =('00:00:00').split(':');
            }
            valueArray = valueArray.concat(t2);
            valueArray.splice(3, 1);

            def.value = valueArray;
        }


        //处理hideMinute
        if(def.hideHour)
        {
            def.cols.splice(3,1);
            def.cols.splice(3,1);
            def.cols.splice(3,1);
            def.cols.splice(3,1);
        }
        //处理hideMinute
        else if(def.hideMinute)
        {
            def.cols.splice(5,1);
            def.cols.splice(5,1);
        }
    }

    var defaults = {

        rotateEffect: false,  //为了性能

        customMinuteInterval:60,//默认分钟间隔为1/4;
        //默认的初始值设置为现在，精确到分钟
        value: [today.getFullYear(), fnum(today.getMonth()+1), fnum(today.getDate()), today.getHours(), fnum(today.getMinutes())]

    };

    /*
     $(".demo").datetimePickerCustom({
     customValue:'2018-12-30 14:00:00',//指定控件中的当前时间日期,需要是示例所示标准格式
     customMinuteInterval:4,//指定分钟的间隔方式，此处整型指定分钟间隔的分母，如指定4，则为1/4，即分钟选择会变成00,15,30,45，该值不能为0
     hideMinute:true,//是否隐藏分钟,隐藏分钟则控件值为yyyy-MM-dd hh
     hideHour:false,//是否隐藏小时,隐藏小时则控件值为yyyy-MM-dd
     minDate:'2012-12-30 14:00:00',//指定最小日期时间
     maxDate:'2016-01-28 16:00:00',//指定最大日期时间
     hourLimit:[7,8,9,11,12,13,14,15,16]//指定小时限制，只有数组中出现的小时才能被选择

     });
     $(".demo1").datetimePickerCustom({
     customValue:'2011-12-30 14:00:00',//指定控件中的当前时间日期,需要是示例所示标准格式
     customMinuteInterval:4,//指定分钟的间隔方式，此处整型指定分钟间隔的分母，如指定4，则为1/4，即分钟选择会变成00,15,30,45，该值不能为0
     hideMinute:true,//是否隐藏分钟,隐藏分钟则控件值为yyyy-MM-dd hh
     hideHour:false,//是否隐藏小时,隐藏小时则控件值为yyyy-MM-dd
     minDate:'2012-12-30 14:00:00',//指定最小日期时间
     maxDate:'2016-01-28 16:00:00',//指定最大日期时间
     hourLimit:[7,8,9,11,12,13,14,15,16]//指定小时限制，只有数组中出现的小时才能被选择
     });

     $(".demo1").datetimePickerCustom('setCustomValue','2016-12-13 14:00:00')//更改时间
     */
    $.fn.datetimePickerCustom = function(params) {
        var args = arguments;
        //console.log(this);
        return this.each(function() {
            if(!this) return;
            var $this = $(this);

            var picker = $this.data("picker");
            if(!picker) {
                var p = $.extend({},defaults, params);

                initDefaults(p);
                $(this).picker(p);
                $this.data("picker", picker);
                if (p.customValue)
                {
                    var date=DateTimeUtils.Convert.parseDate(p.customValue);
                    if(p.hideHour)
                    {
                        $(this).val(date.getFullYear()+'-'+(date.getMonth()+1)+'-'+date.getDate());
                    }
                    else if(p.hideMinute)
                    {
                        $(this).val(date.getFullYear()+'-'+(date.getMonth()+1)+'-'+date.getDate()+' '+date.getHours());
                    }
                    else $(this).val(DateTimeUtils.Convert.formatDate(p.customValue));
                }
                else if(p.value)
                {
                    $(this).val(p.formatValue(p, p.value, p.value));
                }
            }
            if(typeof params === typeof "a") {
                if(params.toLowerCase()=='setcustomvalue')
                {

                    var newDate=DateTimeUtils.Convert.parseDate(args[1]);
                    //console.log('setvalue');
                    //picker['open'].apply();
                    //$(this).val(DateTimeUtils.Convert.formatDate(newDate));
                    var tmp=[
                        fnum(newDate.getFullYear()),
                        fnum(newDate.getMonth()+1),
                        fnum(newDate.getDate()),
                        fnum(newDate.getHours()),
                        fnum(newDate.getMinutes()),
                        '00'
                    ];


                    if(!picker.initialized)
                    {
                        picker['open'].apply(picker);
                        picker['close'].apply(picker);
                    }
                    picker['setValue'].apply(picker, [tmp]);


                }
                else {
                    //console.log(Array.prototype.slice.call(args, 1));
                    picker[params].apply(picker, Array.prototype.slice.call(args, 1));
                }

            }
        });
    };

}(Zepto);